<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // async 是用来解决异步回调的问题 
        // async 是添加在函数关键字前面 声明函数内有异步要执行的
        // async 是个函数 返回值是个promise实例
        // awrit语句后所有的代码都会变成异步代码 它只能等promise实例 
       
        // async function getData() {
        //     console.log('开始获取');
        //     await setTimeout(function () {
        //         console.log('获取成功');
        //     }, 3000);
        //     console.log('获取成功之后的语句');
        // }
        // getData()
        // 执行结果 开始获取  获取成功之后的语句  获取成功
        // 结果分析：原理上 应该等await语句执行完之后 才执行await后面的语句 但是最后的结果却是先打印await之后的语句
        //          造成这样的根本原因是 await之后等待promise实例 当await后面跟的是promise实例时 await之后的语句才会等await语句执行完之后再执行


        async function getDatas() {
            console.log('开始获取');
           const p1= await new Promise((resolve,reject) => {
                try {
                    // throw new Error('获取出错啦...')
                    setTimeout(function () {
                        console.log('获取成功');
                        resolve('ok')
                    }, 3000);
                } catch (e) {
                    reject(e.message)
                }
            }) 
            console.log('p1',p1)
            console.log('获取成功之后的语句');
        }
        getDatas()
       
        const result = getDatas()
        console.log(result);

        // 当await后面跟的promise实例时 如果成功执行 则进行await之后语句的执行 一但await执行失败 就会报错 退出async函数 不再执行后面的语句
        
        // async函数的返回值为一个promise实例 
    
  //练习 实现先获取A数据 再获取B数据 最后获取C数据
        // async function foo(){
        //     await  new Promise((resolve,reject)=>{
        //         console.log('开始获取A数据');
        //         try{
        //             // throw new Error('获取A失败')
        //             setTimeout(function(){
        //                 console.log('获取A数据成功');
        //                 resolve('A数据')
        //             },2000)
        //         }catch(e){
        //             reject(e.message)
        //         }
        //     });
        //     await new Promise((resolve,reject)=>{
        //         console.log('开始获取B数据');
        //         try{
        //              // throw new Error('获取B失败')
        //             setTimeout(function(){
        //                 console.log('获取B数据成功');
        //                 resolve('B数据')
        //             },1500)
        //         }catch(e){
        //             reject(e.message)
        //         }
        //     });
        //     await new Promise((resolve,reject)=>{
        //         console.log('开始获取C数据');
        //         try{
        //              // throw new Error('获取C失败')
        //             setTimeout(function(){
        //                 console.log('获取C数据成功');
        //                 resolve('C数据')
        //             },2500)
        //         }catch(e){
        //             reject(e.message)
        //         }
        //     });
        // }
        // foo()
    </script>
</body>

</html>